/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package apresentacao;

import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.JFrame;

/**
 *
 * @author Pedro
 * @author Thiago
 */
public class Controle {
    
    private final Dados data;
    
    public Controle () {
        data = new Dados();
    }
    
    public void criaInterface () {
        // cria frame principal
        JFrame mainFrame = new JFrame("SAToDA");
        mainFrame.setVisible(false);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // cria e inicia painel e o adiciona no frame
        Painel mainPanel = new Painel(this);
        mainPanel.iniciaPainel();
        mainFrame.getContentPane().add(mainPanel, BorderLayout.CENTER);
        
        // ajustes para a posicao e tamanho da janela
        mainFrame.setResizable(false);
        mainFrame.pack();
        mainFrame.pack();
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);
    }
    
    public void iniciaSessao () {
        /* a instancia de Dados recebe como entradas as disciplinas
        aprovadas e todas as eletivas possiveis pro curso e ano de catalogo */
        data.recebeAprovadas();
        data.recebeTodasElet();
        
        // debug
        data.printArray(data.getAprovadas(), "Aprovadas");
        data.printArray(data.getTodasElet(), "Todas elet");
        
        try {
            this.trataEletivas(data.getTodasElet(), data.getAprovadas()); 
        } catch (IllegalArgumentException e) {
            System.err.println("Dados errados! " + e);
        }
        
        this.defPrefixos();
        
        // debug
        data.printArray(data.getPossiveisElet(), "Possiveis elet");
        data.printArray(data.getPrefixos(), "Prefixos");
    }
    
    /*
    metodo que verifica de todas as eletivas possiveis, quais sao possiveis
    para o aluno cursar, dependendo das que ele ja cursou
    */
    public void trataEletivas (ArrayList<String> todasElet, ArrayList<String> aprovadas) {
        
        // percorre todas as disciplinas eletivas para pegar seus pre-requisitos
        for (String elet : todasElet) {
            // MODULO 3 DUMMY - USADO PARA PEGAR OS PRE-REQUISITOS DE UMA ELETIVA
            
            int qtdFamilia = data.getQtdFamilia(elet);
            
            // caso nao haja pre-requisito
            if (qtdFamilia == 0) {
                data.addPossivelElet(elet);
            }
            
            // caso haja no minimo 1 pre-requisito, percorre familias de pre-req
            boolean podeCursar;
            for (int i=1; i<=qtdFamilia; i++) {
                podeCursar = true;
                
                ArrayList<String>listaPreReq = data.getListaPreReq (elet, i);
                
                // percorre pre-reqs de uma familia de pre-requisitos
                for (String preReq : listaPreReq) {

                    /* se a sigla da disciplina for do tipo AAXYZ, o
                    pre-requisito eh que se tenha um CP minimo de 0.XYZ */
                    if ( preReq.matches("AA\\d\\d\\d") ) {
                        double cpMin = Double.parseDouble( preReq.substring(2,5) );
                        cpMin = cpMin / 1000.0;
                        if (data.getCP() < cpMin) {
                            podeCursar = false;
                            break;
                        }
                    }
                    // senao, se o pre-requisito for uma disciplina
                    else if (! preReqCursada(preReq, aprovadas) ) {
                        podeCursar = false;
                        break;
                    }
                }
                
                /* se achou uma familia de pre-requisitos cumpridas, adiciona a eletiva
                na lista de possiveis eletivas e passa para a proxima eletiva */
                if (podeCursar) {
                    data.addPossivelElet(elet);
                    break;
                }
            }
        }
    }
    
    public boolean preReqCursada (String preReq, ArrayList<String> aprovadas) {
        for (String s : aprovadas) {
            if ( s.equals(preReq) ) {
                return true;
            }
        }
        
        return false;
    }
    
    public void defPrefixos () {
        ArrayList<String> pref = new ArrayList<>();
        ArrayList<String> possElet = data.getPossiveisElet();
        
        /* cria ArrayList dos prefixos */
        for (String s : possElet) {
            try {
                String cod = s.substring(0, 2);
                if ( !pref.contains(cod) ) {
                    pref.add(cod);
                }
            } catch (IllegalArgumentException e) {
                System.err.println("Dados errados!" + e);
            }
        }
        
        data.setPrefixos(pref);
    }
    
    public ArrayList<String> getPrefixos () {
        return this.data.getPrefixos();
    }
    
    
    /*
    metodo que seleciona as eletivas possiveis de cursar de acordo com o prefixo escolhido
    */
    public String[] selecionaEletivas (String prefixo) {
        ArrayList<String> eletArrList = new ArrayList<>();
        ArrayList<String> possElet = data.getPossiveisElet();
        
        if (prefixo == null || possElet == null || possElet.isEmpty()) {
            return null;
        }
        
        for (String s : possElet) {
            try {
                String prefDiscip = s.substring(0, 2);
                if ( prefDiscip.equals(prefixo) ) {
                    String result = s;
                    
                    /* se existe um nome valido de disciplina para
                    o codigo dado, adiciona ela no resultado */
                    String nomeDiscip = this.data.getNomeDiscip(s);
                    if (!nomeDiscip.equals("")) {
                        result += " - " + nomeDiscip;
                    }
                    eletArrList.add(result);
                }
            } catch (IllegalArgumentException e) {
                System.err.println("Dados incorretos! " + e);
            }
        }
        
        String[] eletArray = new String[eletArrList.size()];
        eletArray = eletArrList.toArray(eletArray);
        
        return eletArray;
    }

}
